import torch
import torch.nn as nn
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 假设我们有一个已经训练好的模型和测试数据加载器
model = ...  # 已训练好的模型
test_loader = ...  # 测试数据加载器

# 设置模型为评估模式
model.eval()

all_preds = []
all_labels = []

# 不计算梯度以节省内存和计算资源
with torch.no_grad():
    for images, labels in test_loader:
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs, 1)
        all_preds.extend(predicted.cpu().numpy())
        all_labels.extend(labels.cpu().numpy())

# 计算准确率
accuracy = accuracy_score(all_labels, all_preds)
print(f'Accuracy: {accuracy * 100:.2f}%')

# 打印混淆矩阵
conf_matrix = confusion_matrix(all_labels, all_preds)
print('Confusion Matrix:')
print(conf_matrix)

# 打印分类报告
class_report = classification_report(all_labels, all_preds)
print('Classification Report:')
print(class_report)

# 在这个示例中，我们首先将模型设置为评估模式，然后遍历测试数据加载器，获取模型的预测结果。
# 最后，我们使用 sklearn 库中的函数来计算并打印准确率、混淆矩阵和分类报告。

# 评估模型的原理是什么？
# 评估模型是机器学习和深度学习中的一个重要步骤，它的目的是衡量模型在未见过的数据上的表现。
# 通过评估，我们可以了解模型的泛化能力，即模型在新数据上的表现如何。
# 以下是评估模型的一些基本原理和方法：
#
# 1.
# 数据集划分
# 通常，我们会将可用的数据划分为训练集、验证集和测试集。
# 训练集：用于训练模型。
# 验证集：用于调整模型的超参数和选择最佳模型。
# 测试集：用于最终评估模型的性能，确保模型没有过拟合。
#
# 2.
# 损失函数（LossFunction）
# 损失函数是一个衡量模型预测值与真实值之间差异的函数。常见的损失函数包括均方误差（MSE）、交叉熵损失（Cross - Entropy
# Loss）等。损失函数的值越小，表示模型的预测越准确。
#
# 3.
# 准确率（Accuracy）
# 准确率是分类任务中常用的评估指标，表示模型正确分类的样本占总样本的比例。对于多分类问题，准确率定义为：
# Accuracy = Number of Correct Predictions / TotalNumber of Predictions
#
# 4.
# 混淆矩阵（ConfusionMatrix）
# 混淆矩阵是一个表格，用于描述分类模型的性能。它显示了实际类别与预测类别之间的关系，可以提供更详细的性能分析。
#
# 5.
# 精确率（Precision）、召回率（Recall）和F1分数（F1 Score）
# 这些指标主要用于二分类或多分类问题，它们提供了对模型性能的不同视角：
#
# 精确率：表示被预测为正类的样本中实际为正类的比例。
# 召回率：表示实际为正类的样本中被正确预测为正类的比例。
# F1分数：精确率和召回率的调和平均数，综合考虑了精确率和召回率。
# 6.
# ROC曲线和AUC值
# ROC曲线（Receiver Operating Characteristic Curve）和AUC值（Area Under the Curve）用于评估二分类模型的性能。
# ROC曲线展示了不同阈值下的真阳性率（TPR）和假阳性率（FPR），而AUC值则表示曲线下面积，反映了模型的整体性能。
#
# 7.
# 其他指标
# 根据具体任务的不同，可能还会使用其他指标来评估模型性能，例如均方根误差（RMSE）、平均绝对误差（MAE）等。


